%%%%%%%%%%%   ALGORITHMS STYLE  %%%%%%%%%%%
% This style defines an environment for algorithms with the following
% features:
% 
% 1) Defines an Theorem like environment (not exactly one) for
%    algorithms called ``algorithm''.
%    \begin{algorithm}{NAME} ... \end{algorithm}
%    NAME is the NAME of the algorithm.
%    Algorithms are numbered using a counter called ``algorithm''.
% 
% 2) Inside this environment, the following commands are defined.
% 
%    \=  Put the small left arrow commonly used for assignment.
% 
%    \invariant{INVARIANT} Use to describe invariants, put its parameter
%                          between ``{}'' in math mode.
% 
%    \begin{Block} ... \end{Block} Environment use to start a indented
%                                  block of instructions \end{Block} put
%                                  an ``end'' to close the block.
% 
%    \nextBlock{SEPARATOR} Inside a Block, it allows to put a separator
%                          of parts of the indented block. Usefull for
%                          constructions like ``IF..THEN..ELSE..END''
%                       i.e. If cond then
%                            \begin{Block}
%                               then part
%                            \nextBlock{else}
%                               else part
%                            \end{Block}
% 
% 3) \Blockindent and \algorithmindent are length that specify the
%    indentention of Blocks and of the algorithm resp.
% 
%   4) Instructions are separated by ``\\'', ``\par'' or by leaving a
%      blank line. Before an ``\end{Block}'' a ``\\'' can't be used.
% 
% 
% Created by Jose Alberto Fernandez R.
% e-mail:    alberto@cs.umd.edu
% 

% 
\newcounter{algorithm}
\newtheorem{Alg@orithm}[algorithm]{Algorithm}
% Invariants
\newcommand{\inv@ariant}[1]{\mbox{$\{#1\}$}}
% Steps environment
\newenvironment{ste@ps}[1]{
\begin{list}{}
{\setlength\labelsep{0in}
\addtolength\partopsep\topsep
\addtolength\partopsep\parsep
\setlength\parsep{0in}
\setlength\topsep{0in}
\setlength\itemsep{0in}
\setlength\labelwidth{0in}
\setlength\rightmargin{0in}
\setlength\leftmargin{#1}}
}{
\end{list}
}

% Block environment
% Indentation of the Block
\newlength{\Blockindent}
% NextBlock command
\newcommand{\next@Block}[1]{
\end{ste@ps}
#1
\begin{ste@ps}{\Blockindent}
\item
}

\newenvironment{Blo@ck}{
\let\nextBlock\next@Block
\begin{ste@ps}{\Blockindent}
\item
}{
\end{ste@ps}
end
}
% Algorithm environment
% Assign command
\newcommand{\ass@ign}{\mbox{$\leftarrow$}}
% Indentation of the algorithm
\newlength{\algorithmindent}
% Algorithm definition
\newenvironment{algorithm}[1]{
\let\=\ass@ign
\let\invariant\inv@ariant
\let\Block\Blo@ck
\let\endBlock\endBlo@ck
\begin{Alg@orithm} #1
\rm\par
\begin{ste@ps}{\algorithmindent}
\item
}{
\end{ste@ps}
\bf end
\end{Alg@orithm}
}

% Setting default indentation
\setlength{\algorithmindent}{1em}
\setlength{\Blockindent}{2em}

% End of algorithm.sty
